package ve.ucv.patologiaocular.showcase;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import ve.ucv.patologiaocular.dao.UsuarioDAO;
import ve.ucv.patologiaocular.dao.UsuarioDAOImpl;
import ve.ucv.patologiaocular.domain.Usuario;

import com.opensymphony.xwork2.ActionSupport;

public class ListarUsuario extends ActionSupport {

	private static final long serialVersionUID = 6074736857724195316L;
	
	private static final Log log = LogFactory.getLog(ListarUsuario.class);
	private UsuarioDAO usuarioDAO = null;
	private List<Usuario> gridModel;
	private List<Usuario> usuarios;
	private Integer rows = 0;
	private Integer page = 0;
	private Integer total = 0;
	private Integer records = 0;
	private boolean loadonce = false;
	private String nombre;
	private String apellido;
	private String nombreUsuario;
	private String estatus;
	private String aprobado;

	public String execute()
	{	
	    log.debug("Page " + getPage()+" Rows " + getRows());
	    this.usuarioDAO = new UsuarioDAOImpl();
	   
	    if(nombre == null && apellido == null && nombreUsuario == null && estatus == null && aprobado == null){
    		usuarios = usuarioDAO.listarUsuarios();
	    }
	    else{
	    	usuarios = usuarioDAO.buscarUsuario(nombre,apellido,nombreUsuario,estatus,aprobado);
	    }

	    setRecords(usuarios.size());

	    int to = (getRows() * getPage());
	    int from = to - getRows();

	    if (to > getRecords()) to = getRecords();

	    if (loadonce)
	    {
	      setGridModel(usuarios);
	    }
	    else
	    {
	    	setGridModel(usuarioDAO.obtenerUsuarios(usuarios, from, to));
	    }

	    setTotal((int) Math.ceil((double) getRecords() / (double) getRows()));

	    return SUCCESS;
	}

	public String getJSON()
	{
	    return execute();
	}

	/**
	* @return how many rows we want to have into the grid
	*/
	public Integer getRows()
	{
	    return rows;
	}

	/**
	* @param rows
	*          how many rows we want to have into the grid
	*/
	public void setRows(Integer rows)
	{
	    this.rows = rows;
	}

	/**
	* @return current page of the query
	*/
	public Integer getPage()
	{
	    return page;
	}

	/**
	* @param page
	*          current page of the query
	*/
	public void setPage(Integer page)
	{
	    this.page = page;
	}

	/**
	* @return total pages for the query
	*/
	public Integer getTotal()
	{
	    return total;
	}

	/**
	* @param total
	*          total pages for the query
	*/
	public void setTotal(Integer total)
	{
	    this.total = total;
	}

	/**
	* @return total number of records for the query. e.g. select count(*) from
	*         table
	*/
	public Integer getRecords()
	{
	    return records;
	}

	/**
	* @param record
	*          total number of records for the query. e.g. select count(*) from
	*          table
	*/
	public void setRecords(Integer records)
	{
		this.records = records;

		if (this.records > 0 && this.rows > 0) {
			this.total = (int) Math.ceil((double) this.records / (double) this.rows);
		}
		else {
			this.total = 0;
		}
	}

	public UsuarioDAO getUsuarioDAO() {
		return usuarioDAO;
	}

	public void setUsuarioDAO(UsuarioDAO usuarioDAO) {
		this.usuarioDAO = usuarioDAO;
	}

	/**
	* @return an collection that contains the actual data
	*/
	public List<Usuario> getGridModel()
	{
	    return gridModel;
	}

	/**
	* @param gridModel
	*          an collection that contains the actual data
	*/
	public void setGridModel(List<Usuario> gridModel)
	{
	    this.gridModel = gridModel;
	}

	public List<Usuario> getUsuarios() {
		return usuarios;
	}

	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}
	
	public boolean isLoadonce() {
          return loadonce;
	}
	  
	public void setLoadonce(boolean loadonce)
	{
	    this.loadonce = loadonce;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public String getNombreUsuario() {
		return nombreUsuario;
	}

	public void setNombreUsuario(String nombreUsuario) {
		this.nombreUsuario = nombreUsuario;
	}

	public String getEstatus() {
		return estatus;
	}

	public void setEstatus(String estatus) {
		this.estatus = estatus;
	}

	public String getAprobado() {
		return aprobado;
	}

	public void setAprobado(String aprobado) {
		this.aprobado = aprobado;
	}

}
